<?php
/**
 * Created by 张彪.
 * User: 小马出行
 * Date: 2017/11/21
 * Time: 10:45
 */
namespace my;
use my\Tools;

/**
 * 作用：FTP操作类( 拷贝、移动、删除文件/创建目录 )
 * 时间：2006/5/9
 * 作者：欣然随风
 * QQ：276624915
 */
class FTP
{
	public $off; // 返回操作状态(成功/失败)
	public $conn_id; // FTP连接
	public $return = array('status'=>1,'msg'=>"ok");
	public $img = array('jpg', 'gif', 'png', 'jpeg', 'bmp');
	public $fail_tip1 = array('status'=>400,'msg'=>'FTP服务器连接失败');
	public $fail_tip2 = array('status'=>400,'msg'=>'FTP服务器登录失败');
	/**
	 * 方法：FTP连接
	 * @param $FTP_HOST -- FTP主机
	 * @param $FTP_PORT -- 端口
	 * @param $FTP_USER -- 用户名
	 * @param $FTP_PASS -- 密码
	 * @param $WEB -- 访问来源
	 */
	function __construct($FTP_HOST = '',$FTP_PORT='',$FTP_USER='',$FTP_PASS='',$WEB = 'APP')
	{
		/*$ftp = new Upload();
		$host = $FTP_HOST ? : \think\Env::get('oss'.ENV.'_host');
		$port = $FTP_PORT ? : 21;
		$user = $FTP_USER ? : $ftp->ftp_user_name;
		$pass = $FTP_PASS ? : $ftp->ftp_user_pass;
		$connect_fail = $WEB=='APP'?Security::returnJson($this->fail_tip1):json_encode($this->fail_tip1);
		$login_fail = $WEB=='APP'?Security::returnJson($this->fail_tip2):json_encode($this->fail_tip2);
		$this->conn_id = @ftp_connect($host,$port) or  die($connect_fail);
		@ftp_login($this->conn_id,$user,$pass) or die($login_fail);
		@ftp_pasv($this->conn_id,true); // 打开被动模拟*/
	}
	/**
	 * FTP上传到另一台服务器
	 * @param $files //客户端传来的$_FILES
	 * @param $filename //类型的文件名,比如头像在avatar的文件下
	 * @return array
	 */
	public function ftpUploads($files,$filename,$uid=''){
		foreach ($files as $key => $value) {
			$tmp_name = $value['tmp_name'];
			$ext = substr(strrchr($value['name'],'.'),1);//文件后缀
			$rand = rand(100, 999);
			//类型下面的日期文件夹
            $new_path = $filename .'/'.date('Y-m-d',time());
			$fp=fopen($tmp_name,"r");
			if(!$fp){
				return array("status" => 0, "msg" => "无法找到文件$tmp_name");break;
			}
            if(!empty($uid)){
                $file_rand_name = $uid.'.'.$ext;//用户二维码
            }else{
                $file_rand_name = date("YmdHis").$rand.'.'.$ext;//日期目录下的随机上传的文件名
            }
			$remote_file = $new_path."/".$file_rand_name;//要上传的FTP的根目录下的路径
	//		$res = $this->up_file($tmp_name,$remote_file,$ext);
			$res = Tools::aliUpload($remote_file,$tmp_name);
			if ($res['status'] == 0) {
				return array("status" => 0, "msg" => $res['msg']);break;
			}
			$data[$key] = OSS.$remote_file;
		}
		return array("status" => 1, "msg" => "ok", "data"=>$data);
	}
	/**
	 * 只是为了给上传的路径加个域名
	 * @param $files //客户端传来的$_FILES
	 * @param $filename //类型的文件名,比如头像在avatar的文件下
	 * @return array
	 */
	public function url_ftpUploads($files,$filename){
		$data=array();
		foreach ($files as $key => $value) {
			$tmp_name = $value['tmp_name'];
			$ext = substr(strrchr($value['name'],'.'),1);//文件后缀
			$rand = rand(100, 999);
			//类型下面的日期文件夹
			$new_path = $filename .'/'.date('Y-m-d',time());
			$fp=fopen($tmp_name,"r");
			if(!$fp){
				return array("status" => 0, "msg" => "无法找到文件$tmp_name");break;
			}
			$file_rand_name = date("YmdHis").$rand.'.'.$ext;//日期目录下的随机上传的文件名
			$remote_file = $new_path."/".$file_rand_name;//要上传的FTP的根目录下的路径
	//		$res = $this->up_file($tmp_name,$remote_file,$ext);
			$res = Tools::aliUpload($remote_file,$tmp_name);
			if ($res['status'] == 0) {
				return array("status" => 0, "msg" => $res['msg']);break;
			}
			$data[$key] = OSS.$remote_file;
		}
		return array("status" => 1, "msg" => "ok", "data"=>$data);
	}
	/**
     * 只是为了给上传的路径加个域名
     * @param $files //客户端传来的$_FILES
     * @param $filename //类型的文件名,比如头像在avatar的文件下
     * @return array
     */
    public function url_ftpUploads_file($files,$filename){
        $file='';
        $value=$files['file'];
        $tmp_name = $value['tmp_name'];
        $ext = substr(strrchr($value['name'],'.'),1);//文件后缀
        $rand = rand(100, 999);
        //类型下面的日期文件夹
        $new_path = $filename .'/'.date('Y-m-d',time());
        $fp=fopen($tmp_name,"r");
        if(!$fp){
            return array("status" => 0, "msg" => "无法找到文件$tmp_name");
        }
        $file_rand_name = date("YmdHis").$rand.'.'.$ext;//日期目录下的随机上传的文件名
        $remote_file = $new_path."/".$file_rand_name;//要上传的FTP的根目录下的路径
        //		$res = $this->up_file($tmp_name,$remote_file,$ext);
        $res = Tools::aliUpload($remote_file,$tmp_name);
        if ($res['status'] == 0) {
            return array("status" => 0, "msg" => $res['msg']);
        }
        $file = OSS.$remote_file;
        return array("status" => 1, "msg" => "ok", "data"=>$file);
    }
	public function base64_ftpUploads($files,$filename){
		foreach ($files as $key => $value) {
			$tmp_name = $value['tmp_name'];
		   if(($value["size"] / 1024) > 499){
			 return array("status" => 0, "msg" => '最大图片上传500KB');break;
		   } 
			$ext = substr(strrchr($value['name'],'.'),1);//文件后缀
			$rand = rand(100, 999);
			//类型下面的日期文件夹
			$new_path = $filename .'/'.date('Y-m-d',time());
			$fp=fopen($tmp_name,"r");
			if(!$fp){
				return array("status" => 0, "msg" => "无法找到文件$tmp_name");break;
			}
			$file_rand_name = date("YmdHis").$rand.'.'.$ext;//日期目录下的随机上传的文件名
			$remote_file = $new_path."/".$file_rand_name;//要上传的FTP的根目录下的路径
			//先base64本地文件
			$local_upload = move_uploaded_file($tmp_name, dirname(dirname(dirname(__FILE__))).'/tmp/'.$rand.'.'.$ext);
			if($local_upload){
				$base_img = $this->img2Base64(dirname(dirname(dirname(__FILE__))).'/tmp/'.$rand.'.'.$ext);
				if($base_img){
					$img_base64 = 'data:image/'.$ext.';base64,'.$base_img;//合成图片的base64编码
					@unlink('/tmp/'.$rand.'.'.$ext);
					$res = $this->up_file(dirname(dirname(dirname(__FILE__))).'/tmp/'.$rand.'.'.$ext,$remote_file,$ext);
					if (!$res['status']) {
						return array("status" => 0, "msg" => $res['msg']);break;
					}
					$data[$key] = OSS.$remote_file;
					return array("status" => 1, "msg" => "ok",'base_img'=>$base_img, "data"=>$data);
				}else{
					return array("status" => 0, "msg" => "base64编译出错");break;
				}
				
			}else{
				return array("status" => 0, "msg" => "本地上传出错");break;
			}
		
		}
		
	}
	   public function img2Base64($app_img_file){
			$img_base64 = '';
			$img_info = getimagesize($app_img_file);//取得图片的大小，类型等

			$fp = fopen($app_img_file, "r");     //图片是否可读权限

			if ($fp) {

			$file_content = chunk_split(base64_encode(fread($fp, filesize($app_img_file))));//base64编码
			str_replace(array("\r\n", "\r", "\n"), "", $file_content);
			//$img_base64 = 'data:image/' . $img_type .';base64,' . $file_content;//合成图片的base64编码
			fclose($fp);

			return $file_content;

			 }
	}
	/**
	 * 文件上传为多数组形式
	 * @param $file //文件信息数组
	 * @param $filename //将要保存的文件夹
	 * @param $pic //文件信息数组的父键值
	 * @return array
	 * */
	public function ftpFileArr($file,$filename,$pic)
	{
		foreach ($file['tmp_name'] as $key => $value) {
			$ext = substr(strrchr($file['name'][$key],'.'),1);//文件后缀
			$rand = rand(100, 999);
			//类型下面的日期文件夹
			$new_path = $filename .'/'.date('Y-m-d',time());
			$fp=fopen($value,"r");
			if(!$fp){
				return array("status" => 0, "msg" => "无法找到文件$value");
				break;
			}
			$file_rand_name = date("YmdHis").$rand.'.'.$ext;//日期目录下的随机上传的文件名
			$remote_file = $new_path."/".$file_rand_name;//要上传的FTP的根目录下的路径
			$res = $this->up_file($value,$remote_file,$ext);
			if (!$res['status']) {
				return array("status" => 0, "msg" => $res['msg']);
				break;
			}
			$data[$pic][$key] = $remote_file;
		}
		return array("status" => 1, "msg" => "ok", "data"=>$data);
	}

	/**
	 * 方法：上传文件
	 * @param $path -- 本地路径
	 * @param $newpath -- 上传路径
	 * @param $ext -- 文件后缀
	 * @param $type -- 若目标目录不存在则新建
	 * @return array
	 */
	private function up_file($path,$newpath,$ext,$type=true)
	{
		if($type) $res = $this->dir_mkdirs($newpath);
		if($res['status']===0) return array('status'=>0,'msg'=>$res['msg']);
		ftp_pasv($this->conn_id, true);   //开启被动模式传输
//        $mode = in_array(strtolower($ext),$this->img) ? FTP_BINARY : FTP_ASCII;
		$this->off = ftp_put($this->conn_id,$newpath,$path,FTP_BINARY);//FTP_BINARY不改变文件
		@ftp_chmod($this->conn_id, 0777, $newpath);
		if(!$this->off) return array('status'=>0,'msg'=>"文件上传失败，请检查权限及路径是否正确！",'data'=>$newpath.'-'.$path.'-'.FTP_BINARY);
		return $this->return;
	}
	/**
	 * 方法：移动文件
	 * @param $path -- 原路径(不需要域名)
	 * @param $newpath -- 新路径(不需要域名)
	 * @param $filename -- 文件名称
	 * @return array
	 */
	function move_file($path,$newpath,$filename='')
	{
		$res_check = $this->checkDir($newpath);
		if($res_check['status']===0) $res = $this->dir_mkdirs($newpath);
		if($res['status']===0) return array('status'=>0,'msg'=>$res['msg']);

		$this->off = @ftp_rename($this->conn_id,$path,$newpath);
		if(!$this->off) return array('status'=>0,'msg'=>"{$filename}文件移动失败，请检查权限及原路径是否正确！");
		$this->return['data'] = $newpath;
		return $this->return;
	}
	/**
	 * 方法：复制文件
	 * //说明：由于FTP无复制命令,本方法变通操作为：下载后再上传到新的路径
	 * @param $path //原路径
	 * @param $newpath // 新路径
	 * @param $downpath // 下载路径
	 * @param $ext -- 文件后缀
	 * @param $type // 若目标目录不存在则新建
	 * @return array
	 */
	function copy_file($path,$newpath,$downpath='',$ext,$type=true)
	{
		if($type) $res = $this->dir_mkdirs($newpath);
		if($res['status']===0) return array('status'=>0,'msg'=>$res['msg']);
		$rand = date('YmdHis').rand(100,999);
		$tmp_name = "tmp_$rand.".substr(strrchr($path,'.'),1);//临时文件的名称
		$downpath = $downpath?:ROOT_PATH."/temp/$tmp_name";
		$local_temp_dir = substr($downpath,0,strrpos($downpath,'/'));//本地临时存储
		if(!is_dir($local_temp_dir)){
			mkdir($local_temp_dir,0775,true);
		}
		$mode = in_array(strtolower($ext),$this->img) ? FTP_BINARY : FTP_ASCII;
		$this->off = @ftp_get($this->conn_id,$downpath,$path,$mode);// 下载
		if(!$this->off) return array('status'=>0,'msg'=>"文件复制失败，请检查权限及原路径是否正确！");
		$res_up = $this->up_file($downpath,$newpath,$type);
		if(!$res_up['status']) return array('status'=>0,'msg'=>$res_up['msg']);
		@unlink($downpath);
		return $this->return;
	}
	/**
	 * 方法：删除文件
	 * @param $path -- 路径(不需要域名)
	 * @return array
	 */
	function del_file($path)
	{
		$this->off = @ftp_delete($this->conn_id,$path);
		if(!$this->off) return array('status'=>0,'msg'=>"文件删除失败，请检查权限及路径是否正确！");
		return $this->return;
	}
	/**
	 * 方法：生成目录
	 * @param $path -- 路径
	 * @return array
	 */
	function dir_mkdirs($path)
	{
		$path_arr = explode('/',$path); // 取目录数组
		$file_name = array_pop($path_arr); // 弹出文件名
		$path_div = count($path_arr); // 取层数
		foreach($path_arr as $val) // 创建目录
		{
			if(@ftp_chdir($this->conn_id,$val) == FALSE)
			{
				$tmp = @ftp_mkdir($this->conn_id,$val);
				if($tmp == FALSE)
				{
					return array('status'=>0,'msg'=>'目录创建失败，请检查权限及路径是否正确！');
					break;
				}
				@ftp_chmod($this->conn_id, 0775, $val);
				@ftp_chdir($this->conn_id,$val);
			}
		}
		return $this->return;
		/*for($i=1;$i=$path_div;$i++) // 回退到根
		{
			@ftp_cdup($this->conn_id);
		}*/
	}
	/**
	 * 方法：检查目录是否存在
	 * @param $path -- 路径
	 * @return array
	 */
	function checkDir($path)
	{
		$path_arr = explode('/',$path); // 取目录数组
		foreach($path_arr as $val) // 创建目录
		{
			if(@ftp_chdir($this->conn_id,$val) == FALSE)
			{
				return array('status'=>0,'msg'=>'目录不存在');
				break;
			}
		}
		return $this->return;
	}
	/**
	 * 方法：关闭FTP连接
	 */
	function close()
	{
		@ftp_close($this->conn_id);
	}
}
?>